#ifndef MAX30102_H
#define MAX30102_H

#include <rtthread.h>
#include <rtdevice.h>

// MAX30102寄存器地址
#define MAX30102_REG_INT_STATUS1    0x00
#define MAX30102_REG_INT_STATUS2    0x01
#define MAX30102_REG_INT_ENABLE1    0x02
#define MAX30102_REG_INT_ENABLE2    0x03
#define MAX30102_REG_FIFO_WR_PTR    0x04
#define MAX30102_REG_OVF_COUNTER    0x05
#define MAX30102_REG_FIFO_RD_PTR    0x06
#define MAX30102_REG_FIFO_DATA      0x07
#define MAX30102_REG_FIFO_CONFIG    0x08
#define MAX30102_REG_MODE_CONFIG    0x09
#define MAX30102_REG_SPO2_CONFIG    0x0A
#define MAX30102_REG_LED1_PA        0x0C    // Red LED
#define MAX30102_REG_LED2_PA        0x0D    // IR LED
#define MAX30102_REG_PILOT_PA       0x10
#define MAX30102_REG_MULTI_LED_CTRL1 0x11
#define MAX30102_REG_MULTI_LED_CTRL2 0x12
#define MAX30102_REG_TEMP_INTEGER   0x1F
#define MAX30102_REG_TEMP_FRACTION  0x20
#define MAX30102_REG_TEMP_CONFIG    0x21
#define MAX30102_REG_PROX_INT_THRESH 0x30
#define MAX30102_REG_REV_ID         0xFE
#define MAX30102_REG_PART_ID        0xFF

// 模式配置
#define MAX30102_MODE_HR            0x02    // 心率模式
#define MAX30102_MODE_SPO2          0x03    // 血氧模式
#define MAX30102_MODE_MULTI_LED     0x07    // 多LED模式

// 中断标志
#define MAX30102_INT_A_FULL         0x80
#define MAX30102_INT_PPG_RDY        0x40
#define MAX30102_INT_ALC_OVF        0x20
#define MAX30102_INT_PROX_INT       0x10
#define MAX30102_INT_PWR_RDY        0x01
#define MAX30102_INT_TEMP_RDY       0x02

// 数据类型定义
typedef struct {
    uint32_t red;   // 红光数据
    uint32_t ir;    // 红外光数据
} max30102_data_t;

typedef struct {
    float spo2;         // 血氧饱和度 (%)
    uint32_t heart_rate; // 心率 (bpm)
    float temperature;  // 温度 (°C)
} max30102_result_t;

// 函数声明
rt_err_t max30102_init(const char *i2c_name);
rt_err_t max30102_read_data(max30102_data_t *data);
rt_err_t max30102_read_temperature(float *temperature);
rt_err_t max30102_read_fifo_count(uint8_t *available_samples);
void max30102_calculate(max30102_data_t *data, max30102_result_t *result);

// 简化的RT-Thread传感器框架接口
rt_err_t rt_hw_max30102_init(const char *i2c_name);

#endif